import { useMemberStore } from '@/stores'
import type { ResponeseType } from '@/types/ResponseTtpe'
import type { RequestOptionsWithParams } from '@/types/home'
export const BaseUrl = 'http://192.168.1.34:8000'
// 配置请求拦截器
// 这是一个拦截器对象，包含一个 invoke 方法，用于拦截 uni.request 方法的请求参数
const httpInterceptor = {
  invoke(options: RequestOptionsWithParams) {
    options.header = {
      ...options.header,
    }
    console.log('请求拦截器')
    if (!options.url.startsWith('http')) {
      console.log('不是http链接，自动添加前缀')
      options.url = BaseUrl + options.url
    }
    const store = useMemberStore()
    if (store.profile?.token) {
      options.header.Authorization = 'JWT' + ' ' + store.profile.token
    }
    options.timeout = 30000
    console.log('请求拦截器', options)
  },
}
// 给所有的request请求添加请求拦截器
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)
// 封装uni.request请求函数,返回promise对象
//  dataType指定的是返回值的类型
// dataType是一个泛型类型，用于指定返回值的类型
export const uniRequset = <dataType>(options: RequestOptionsWithParams) => {
  return new Promise<ResponeseType<dataType>>((resolve, reject) => {
    uni.request({
      // 防止options被其他调用的地方覆盖
      ...options,
      // 又是一大个坑，success不能自定义类型约束，success本身会有一个RequestSuccessCallbackResult类型约束
      // 这里的success和fail是uni.request的回调函数，不是Promise的回调函数
      success(res) {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data as ResponeseType<dataType>)
        } else if (res.statusCode === 401) {
          const memberStore = useMemberStore()
          // memberStore.clearProfile()
          uni.navigateTo({ url: '/pages/login/login' })
          uni.showToast({
            title: '请登录',
            icon: 'none',
          })
          reject(res)
        } else {
          uni.showToast({
            title: (res.data as ResponeseType<dataType>).message || '请求失败',
            icon: 'none',
          })
        }
      },
      fail(err) {
        uni.showToast({
          title: '网络错误',
          icon: 'success',
        })
        reject(err)
      },
    })
  })
}
